package com.gary.spring.proxy;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @author peng_rui
 * @date 2022/7/3
 */
public class CglibProxyDemo {

    static class CgTarget {
        void foo() {
            System.out.println("CgTarget foo ...");
        };
    }

    public static void main(String[] args) {


        CgTarget cgTarget = new CgTarget();

        //使用cglib完成代理
        //cglib代理：基于父子关系的模式
        // 代理类：子 目标类：父
        // 父类以及内部方法方法不能被final修饰

        CgTarget proxy = (CgTarget) Enhancer.create(CgTarget.class, new MethodInterceptor() {
            /**
             *
             * @param p  代理对象
             * @param method 代理对象的方法
             * @param objects 参数
             * @param methodProxy 方法代理对象 作用与 method相似
             * @return
             * @throws Throwable
             */
            @Override
            public Object intercept(Object p, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                System.out.println("enhance before ...");
                //method 通过反射调用
//                method.invoke(cgTarget, objects);
                //methodProxy 没有通过反射进行调用  spring 使用的就是此方式
                methodProxy.invoke(cgTarget, objects);
                // 不需要传入目标对象，只需要传入代理对象即可
//                methodProxy.invokeSuper(p, objects);
                System.out.println("enhance after ...");
                return null;
            }
        });

        proxy.foo();
    }
}
